package com.ruoyi.energy.mapper;

import java.util.List;
import java.util.Map;
import com.ruoyi.energy.domain.EmsEnergyReport;
import org.apache.ibatis.annotations.Param;

/**
 * 能源报表Mapper接口
 * 
 * @author ruoyi
 * @date 2024-01-20
 */
public interface EmsEnergyReportMapper {
    
    /**
     * 查询能源报表列表
     * 
     * @param emsEnergyReport 能源报表
     * @return 能源报表集合
     */
    public List<EmsEnergyReport> selectEmsEnergyReportList(EmsEnergyReport emsEnergyReport);

    /**
     * 新增能源报表
     * 
     * @param emsEnergyReport 能源报表
     * @return 结果
     */
    public int insertEmsEnergyReport(EmsEnergyReport emsEnergyReport);

    /**
     * 修改能源报表
     * 
     * @param emsEnergyReport 能源报表
     * @return 结果
     */
    public int updateEmsEnergyReport(EmsEnergyReport emsEnergyReport);

    /**
     * 删除能源报表
     * 
     * @param reportId 能源报表主键
     * @return 结果
     */
    public int deleteEmsEnergyReportByReportId(Long reportId);

    /**
     * 批量删除能源报表
     * 
     * @param reportIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteEmsEnergyReportByReportIds(Long[] reportIds);

    /**
     * 根据日期范围查询能源报表
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param reportType 报表类型
     * @return 能源报表集合
     */
    public List<EmsEnergyReport> selectEmsEnergyReportByDateRange(@Param("startDate") String startDate, 
                                                                  @Param("endDate") String endDate,
                                                                  @Param("reportType") String reportType);

    /**
     * 查询设备能耗趋势数据
     * 
     * @param deviceId 设备ID
     * @param reportType 报表类型
     * @param limit 查询限制条数
     * @return 趋势数据
     */
    public List<EmsEnergyReport> selectEnergyTrendByDevice(@Param("deviceId") Long deviceId,
                                                           @Param("reportType") String reportType,
                                                           @Param("limit") Integer limit);

    /**
     * 查询能耗排行榜
     * 
     * @param reportType 报表类型
     * @param reportDate 统计日期
     * @param limit 查询限制条数
     * @return 排行榜数据
     */
    public List<EmsEnergyReport> selectEnergyRanking(@Param("reportType") String reportType,
                                                     @Param("reportDate") String reportDate,
                                                     @Param("limit") Integer limit);

    /**
     * 查询总体能耗统计
     * 
     * @param reportType 报表类型
     * @param reportDate 统计日期
     * @return 统计数据
     */
    public Map<String, Object> selectTotalEnergyStats(@Param("reportType") String reportType,
                                                      @Param("reportDate") String reportDate);

    /**
     * 查询设备运行状态统计
     * 
     * @param reportType 报表类型
     * @param reportDate 统计日期
     * @return 运行状态统计
     */
    public Map<String, Object> selectDeviceRunningStats(@Param("reportType") String reportType,
                                                        @Param("reportDate") String reportDate);

    /**
     * 查询能效分析数据
     * 
     * @param deviceIds 设备ID集合
     * @param reportType 报表类型
     * @param reportDate 统计日期
     * @return 能效分析数据
     */
    public List<Map<String, Object>> selectEnergyEfficiencyAnalysis(@Param("deviceIds") List<Long> deviceIds,
                                                                    @Param("reportType") String reportType,
                                                                    @Param("reportDate") String reportDate);

    /**
     * 查询成本分析数据
     * 
     * @param reportType 报表类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 成本分析数据
     */
    public List<Map<String, Object>> selectCostAnalysis(@Param("reportType") String reportType,
                                                        @Param("startDate") String startDate,
                                                        @Param("endDate") String endDate);

    /**
     * 生成日报数据
     * 
     * @param reportDate 统计日期
     * @return 影响行数
     */
    public int generateDailyReport(@Param("reportDate") String reportDate);

    /**
     * 生成月报数据
     * 
     * @param reportDate 统计日期
     * @return 影响行数
     */
    public int generateMonthlyReport(@Param("reportDate") String reportDate);

    /**
     * 生成年报数据
     * 
     * @param reportDate 统计日期
     * @return 影响行数
     */
    public int generateYearlyReport(@Param("reportDate") String reportDate);

    /**
     * 检查报表是否已存在
     * 
     * @param deviceId 设备ID
     * @param reportDate 统计日期
     * @param reportType 报表类型
     * @return 存在的报表数量
     */
    public int checkReportExists(@Param("deviceId") Long deviceId,
                                 @Param("reportDate") String reportDate,
                                 @Param("reportType") String reportType);
} 